Лабораторна робота №1
ТЕМА: Дескриптори і таблиці глобальних дескрипторів.
МЕТА: Навчитись програмно описувати дескриптори у таблиці глобальних дескрипторів та завантажувати в регістр процесора GDTR, інформацію про таблицю глобальних дескрипторів.
Короткі теоретичні відомості
При вмиканні процесора в ньому автоматично встановлюється режим реальної адреси. Перехід у захищений режим здійснюється програмно шляхом виконання відповідної послідовності команд. Оскільки багато деталей функціонування процесора в реальному і захищеному режимах істотно відрізняються, програми, призначені для захищеного режиму, повинні бути написані особливим чином. Реальний і захищений режими є несумісними.
Розглянемо програму, яка переключає процесор у захищений режим.
.386P ;Дозвiл трансляцiї привiлейованих команд
;Структура для опису дескрипторiв сегментiв
descr struc
limit dw 0 ;Межа (бiти 0..15)
base_l dw 0 ;База, бiти 0..15
base_m db 0 ;База, бiти 16..23
attr_1 db 0 ;Байт атрибутiв 1
attr_2 db 0 ;Межа (бiти 16..19) i атрибути 2
base_h db 0 ;База, бiти 24..31
descr ends
;Сегмент даних
data segment use16 ;16-розрядна програма
;Таблиця глобальних дескрипторiв GDT
gdt_null descr <0,0,0,0,0,0> ;Селектор 0 - обов'язковий
;нульовий дескриптор
gdt_data descr <data_size-1,0,0,92h,0,0> ;Селектор 8,сегмент даних
gdt_code descr <code_size-1,0,0,98h,0,0> ;Селектор 16,сегмент команд
gdt_stack descr <255,0,0,92h,0,0> ;Селектор 24, сегмент стеку
gdt_size=$-gdt_null ;Розмiр GDT
pdescr dq 0 ;Псевдодескриптор для lgdt
real_sp dw 0 ;Змiнна для збереження SP
mes db 27, '[31;42m Повернулися в реальний режим! ',27,'[0m$'
data_size=$-gdt_null ;Розмiр сегменту даних
data ends ;Кiнець сегменту даних
;Сегмент команд
text segment 'code' use16 ;16-розрядна програма
assume CS:text, DS:data
main proc
mov AX, data ;Iнiцiалiзацiя DS
mov DS, AX ;у реальному режимi
;Знайдемо 32-бiтову лiнiйну адресу сегменту даних
mov DL,0
shld DX,AX,4
shl AX,4
mov BX,offset gdt_data
mov [BX]. base_l,AX
mov [BX]. base_m,DL
;Знайдемо 32-бiтову лiнiйну адресу сегменту команд
mov AX, CS
mov DL,0
shld DX,AX,4
shl AX,4
mov BX,offset gdt_code
mov [BX]. base_l,AX
mov [BX]. base_m,DL
;Знайдемо 32-бiтову лiнiйну адресу сегменту стеку
mov AX,SS
mov DL,0
shld DX,AX,4
shl AX,4
mov BX,offset gdt_stack
mov [BX]. base_l,AX
mov [BX]. base_m,DL
;Пiдготуємо дескриптор i завантажимо регiстр GDTR
mov BX,offset gdt_data ;Адреса GDT
mov AX,[BX].base_l;Одержимо та занесемо у pdescr
mov word ptr pdescr+2, AX ;базу, бiти 0..15
mov DL,[BX]. base_m;Одержимо i занесемо у pdescr
mov byte ptr pdescr+4, DL ;базу, бiти 16..23
mov word ptr pdescr, gdt_size-1 ;Межа GDT
lgdt pdescr ;Завантажимо регiстр GDTR
;Пiдготуємося до повернення в реальний режим
mov AX, 40h ;Налаштуємо ES на область
mov ES,AX ;даних BIOS
mov word ptr ES:[67h],offset return;Зсув точки повернення
mov ES:[69h],CS ;Сегмент точки повернення
;Пiдготуємося до переходу в захищений режим
cli ;Заборона апаратних переривань
mov AL,0Fh ;Вибiрка байту стану вiдключення
out 70h,AL ;Порт КМОП-мiкросхеми
mov AL, 0Ah ;Установка режиму вiдновлення
out 71h,AL ;пiсля скидання процесора
;Перехід в захищений режим
smsw AX ;Одержимо слово стану комп’ютера
or AX,1 ;Встановимо бiт PE
l...